<?php
class Units extends Controller{
    
    var $name = 'units';
    
    /**
     * Página Inicial da Unidade
     * Lista todas as unidades criadas no banco de dados
     */
    public function index_action(){
    	$this->bar_title = 'Objetos de Aprendizagem';
    	
    	$conditions = array('courseid'=>$this->course->id);
    	$units = $this->DB->get_records('oaeditor_units', $conditions);    	
    	$units = array('units'=>$units);
    	
    	$this->view('index', $units);
    }
    
    /**
     * Adicionar unidade
     */
    public function add(){
    	$this->bar_title = 'Objetos de Aprendizagem : Novo';
    	
    	//Verifica se um post foi enviado
    	if(isset($_POST['name']) && $_POST['name']) {

    		$record->name = $_POST['name'];
    		$record->userid = $this->USER->id;
    		$record->courseid = $this->get_course()->id;
    		$record->path = $this->createDir($_POST['name']); //Cria o diretório da unidade na pasta files
    		$this->createDir($record->path.DS.'0');
    		$record->date = date('Y-m-d H:m:s');
			
    		//Cria o grafo em xml no diretorio da unidade
    		$this->createXML($record->name);

    		try {
    			//Salva a unidade no banco de dados
    			$this->DB->insert_record('oaeditor_units', $record, false);
    			$this->setMens('OA criado com sucesso.');
				header('Location: '.WWW_APP.'units/');
    		}catch(Exception $ex) {
    			$this->setErro('Não foi possível salvar a unidade. '.$ex);    	
    			header('Location: '.WWW_APP.'units/');
    		}
    	}   	
    
    	$this->view('add');
    }
    
    /**
    * Editar unidade
    */
	function edit(){
    	$this->bar_title = 'Objetos de Aprendizagem : Editar';
    	
    	$data['id'] = $this->getParam('unit');   	
    	$data['node'] = $this->getParam('node') ? $this->getParam('node') : 0;
    	$data['level'] = $this->getParam('level') ? $this->getParam('level') : 1;
    	
    	//Verifica se o id foi passado via url
    	if(!empty($data['id'])){
    		$result = $this->DB->get_records('oaeditor_units',array('id'=>$data['id']));
    		
    		//Verifica se existe a unidade no banco
    		if($result){
    			//Monta a visualização do grafo como estrutura de pasta
    			$data['treeview'] = $this->tree_edit($result[$data['id']]->name, $data['id'], $data['node']);
    			
    			//Vefica o nível (sintetico, detalhado e saiba mais)
    			if($data['level']){
    				
    				//Pega o caminho do arquivo
    				$way = $this->getWay($result[$data['id']]->path, $data['node'], $data['level']);
    				     				
    				try {
 						//carrega o conteudo e seta para ser visulaizado no ckeditor   		
    					$data['content'] = file_get_contents($way);    		
    				} catch (Exception $e) {
    					$this->setErro('Erro ao ler conteudo de arquivo. '.$e);
    					header('Location: '.WWW_APP.'units/');
    				}
    			}
    			
    			//chama a view e seta o data
    			$this->view('edit', $data);
    		}
    		else{
    			//Se a unidade não existir no banco de dados.
    			$this->setErro('Unidade não existe.');
    			header('Location: '.WWW_APP.'units/');
    		}
    			
    	}else{
    		//Se não passado o id da unidade via url.
    		$this->setErro('O endereço que você acessou não existe.');
    		header('Location: '.WWW_APP.'units/');
    	}    	  	
    }
    
    /**
    * Visualização de uma unidade
    */
    function vision() {
    	$this->bar_title = 'Objetos de Aprendizagem : Interagindo';
    	
    	$data['id'] = $this->getParam('unit');
    	$data['node'] = $this->getParam('node') ? $this->getParam('node') : 0;
    	
    	//Verifica se o id foi passado via url
    	if(!empty($data['id'])){
	    	$result = $this->DB->get_records('oaeditor_units',array('id'=>$data['id']));
	    	
	    	//Verifica se existe a unidade no banco
	    	if($result){
	    		$data['name_unit'] = $result[$data['id']]->name;

	    		//Monta a visão do grafo com a estrura de pastas
	    		$data['treeview'] = $this->tree_vision($data['name_unit'], $data['id'], $data['node']);
	    		
	    		$data['content'] = $this->get_content($data['id'], $data['name_unit'], $data['node']);
// 	    		try {
// 	    			//carrega o conteudo e seta para ser visulaizado no ckeditor
// 	    			$data['content'] = file_get_contents($this->getWay($data['name_unit'], $data['node'], '1'));
// 	    		} catch (Exception $e) {
// 	    			$this->setErro('Erro ao ler conteudo de arquivo. '.$e);
// 	    		}
	    		
	    		//chama a view e seta o data
	    		$this->view('vision', $data);
	    	}
	    	else{
	    		//Se a unidade não existir no banco de dados.
	    		$this->setErro('Unidade não existe.');
	    		header('Location: '.WWW_APP.'units/');
	    	}	    		 
    	}else{
    		//Se não passado o id da unidade via url.
    		$this->setErro('O endereço que você acessou não existe.');
    		header('Location: '.WWW_APP.'units/');
    	}   	
    }
    
    /**
    * Deleta um nó do grafo
    */
	function delete() {
		$unit = $this->getParam('unit');
    	$target = $this->getParam('node');
    	
    	if(!empty($unit)){
    		$result = $this->DB->get_records('oaeditor_units',array('id'=>$unit));
    		
    		//Verifica se existe a unidade no banco
    		if($result){

    			//Ler o xml
    			try {
    				$xml = simplexml_load_file(FILES.$result[$unit]->path.DS."graph.xml");
    			} catch (Exception $e) {
    				$this->setErro('Não foi possível carregar o xml. '.$e);
    				header('Location: " "');
    			}
    			
    			//Verifica se o nó que será deletado tem filhos
    			if($this->hasChildren($xml, $target)){
    				$this->setErro('Esse nó possui filhos e não pode ser excluído.');
    				header('Location: '.WWW_APP.'units/edit/unit/'.$unit.'/node/'.$target);
    			}else{
    				//Se não tiver filhos e nó for o raiz, remove todo OA
    				if($target == 0){
    					try{
    						$this->DB->delete_records('oaeditor_units',array('id'=>$unit));
    						$this->removeTree(FILES.$result[$unit]->path);
    						$this->setMens('OA Removido com sucesso.');
    						header('Location: '.WWW_APP.'units/');
    					}catch (Exception $e){
    						$this->setErro('Não foi possível remover o OA. '.$e);
    						header('Location: '.WWW_APP.'units/');
    					}    					
    				}else{//Se não for o nó raiz
						
    					//Procura o nó que será deletado
    					foreach ($xml->node as $node){
    						if($node['id'] == $target){
    							//Captura o nome do nó e o remove
    							$name_node = (String) $node['name'];
    							unset($node[0]);
    						}
    					}    					
						
    					//Pega todos os edge
    					$edges = $xml->edge;
    					$cont = count($edges);
    					
    					$j = 0;
    					for($i = 0; $i < $cont; $i++) {
    						if($edges[$j]['target'] == $target) {
    							unset($edges[$j]);
    							$j -= 1;
    						}    						
    						$j++;
    					}
    					//Remove o link de todos os arquivos
    					$this->addRemoveLink($result[$unit]->path, $name_node, $target, $unit, true);
    					
    					//Salva o Xml
    					try {
    						$xml->saveXML(FILES.$result[$unit]->path.DS."graph.xml");
    						$this->removeTree(FILES.$result[$unit]->path.DS.$target); //Remove o diretório do nó e seu conteúdo
    						$this->setMens('Nó removido com sucesso.');
    						header('Location: '.WWW_APP.'units/edit/unit/'.$unit);
    					} catch (Exception $e) {
    						$this->setErro('Não foi possível salvar o xml. '.$e);
    						header('Location: '.WWW_APP.'units/');
    					}
    				}
    				
    			}
    		}
    		else{
    			//Se a unidade não existir no banco de dados.
    			$this->setErro('Unidade não existe.');
    			header('Location: ""');
    		}    			
    	}else{
    		//Se não passado o id da unidade via url.
    		$this->setErro('O endereço que você acessou não existe.');
    		header('Location: '.WWW_APP.'units/');
    	} 
	    	  	
	}
    
	/**
	* Adiciona um conceito
	*/
    function newConcept() {
    	 
    	$id_unit = $_POST['id_unit'];
    	$id_node_current = $_POST['id_node']; //id do nó corrente
    	$name_node = $_POST['name_node']; //nome do novo nó    	
    	$name_html = htmlentities($name_node, ENT_QUOTES | ENT_IGNORE, "UTF-8");
    	
    	$result = $this->DB->get_records('oaeditor_units',array('id'=>$id_unit));
    
    	if($result){
    		$id_node = $this->addNodeXML($result[$id_unit]->path, $name_node, $id_node_current);    	
    		$tree_edit = $this->tree_edit($result[$id_unit]->name, $id_unit, $id_node_current);
    		$this->addRemoveLink($result[$id_unit]->path, $name_node, $id_node, $id_unit);
    		echo $id_node.'&&'.$tree_edit.'&&'.$name_html;    
    	}else {
    		$this->setErro('Não é possível criar um item.');
    		header('Location: '.WWW_APP.'units/');
    	}
    
    }
    
    function saveContent(){
    	
    	$id_unit = $_POST['unit'];
    	$id_node = $_POST['node'];
    	$level = $_POST['level'];
    	$content = $_POST['content'];
    	
    	$result = $this->DB->get_records('oaeditor_units',array('id'=>$id_unit));    	
//     	$xml = simplexml_load_file(FILES.$result[$id_unit]->name.DS."graph.xml");
    	
//     	foreach($xml->node as $node){
//     		if($node['id'] == $id_node)
//     			$node_name = $node['name'];
//     	}
    	
    	$way = $this->getWay($result[$id_unit]->path, $id_node, $level);
    	   	
    	try {

    		$fp = fopen($way, "w+");
    		$write = fwrite($fp, $content);
    		
    		if($write)
    			echo "Salvo em ".date('d/m/Y')." às ".date('H:m:s');
    		else
    			echo "Ocorreu um problema na hora de salvar";
    		
    		fclose($fp);
    		
    	} catch (Exception $e) {
    		$this->setErro('Erro ao salvar arquivo. '.$e);
    		header('Location: '.WWW_APP.'units/');
    	}
    	
    }
    
    /**
     * 
     * Enter description here ...
     */
    private function createDir($name, $files = false) {
    	//Retira acentos e carecteres especiais, depois converte para minúscula
    	$name = $this->retiraAcentos($name);
    	
    	//Verifica se ja existe o diretório
    	if(is_dir(FILES.$name)) {
    		$this->setErro('Diretório ja existe.');
    	}
    	
    	$create = mkdir(FILES.$name);    	
    	if(!$create) {
    		$this->setErro('Não foi possível criar o diretório.');
    		header('Location: '.WWW_APP.'units/');
    	}
    	
    	return $name;
    }
    
    private function createXML($name) {
    	
    	#versao do encoding xml
		$dom = new DOMDocument("1.0", "UTF-8");
		
		#retirar os espacos em branco
		$dom->preserveWhiteSpace = false;
		
		#gerar o codigo
		$dom->formatOutput = true;
		
		#criando o nó principal (root)
		$graph = $dom->createElement("graph");
		$graph->setAttribute("name", $name);
		$graph->setAttribute("edgedefault", "undirected");
    	
		$key = $dom->createElement('key', '1');
		
		$graph->appendChild($key);
		$dom->appendChild($graph);
		//nome do diretorio
		$path = $this->retiraAcentos($name);
				
		try {			
			# Salva arquivo
			$dom->save(FILES.$path.DS."graph.xml");			
		}catch(Exception $ex) {
			$this->setErro('Não foi possível salvar a unidade.', $ex);
			header('Location: '.WWW_APP.'units/');
		}
    	
    }
    
	private function addNodeXML($path_unit, $name_node, $id_node_current) {
    	
		$xml = simplexml_load_file(FILES.$path_unit.DS."graph.xml");
    	
    	$key = (int) $xml->key;
    	
    	//Verifica se o nó ja existe
    	$exist_node = $this->isNode($xml, trim($name_node));
    	
    	//Se o nó não existir
    	if($exist_node == 0){
    		$node = $xml->addChild('node');
    		$node->addAttribute('id', $key);
    		$node->addAttribute('name', trim($name_node));
    		$node->addAttribute('token', $this->retiraAcentos($name_node));
    		
    		$node = $xml->addChild('edge');
    		$node->addAttribute('source', $id_node_current);
    		$node->addAttribute('target', $key);
    		$node->addAttribute('ref', 'false');
    			 
    		$xml->key = ++$key;
    		--$key;
    			 
    		try {
    			
    			$xml->saveXML(FILES.$path_unit.DS."graph.xml");
    			
    			//cria a estrutura de pastas
    			$path_item = $path_unit.DS.$key;
    			$this->createDir($path_item);
    			
    			return $key;
    			
    		} catch (Exception $e) {
    			$this->setErro('Erro ao manipular o xml. '. $e);
    			header('Location: '.WWW_APP.'units/');
    		}
    		
    	}else{    		
    		//Se existir o nó
    		if($this->isEdge($xml, $id_node_current, $exist_node) != 0){
    			$node = $xml->addChild('edge');
    			$node->addAttribute('source', $id_node_current);
    			$node->addAttribute('target', $exist_node);
    			$node->addAttribute('ref', 'true');
    		
    			try {
    				$retorno = $xml->saveXML(FILES.$path_unit.DS."graph.xml");
    				
    				return $exist_node;
    			
    			} catch (Exception $e) {
    				$this->setErro('Erro ao manipular o xml. '. $e);
    				header('Location: '.WWW_APP.'units/');
    			}
    		}else{
    			return $exist_node;
    		}
    		
    	}    	    	
    
    }
    
   function addLogUnit(){

	   	//Verifica se um post foi enviado
	   	if(isset($_POST['unit']) && isset($_POST['node'])) {
	   	
	   		$record->userid = $this->USER->id;
	   		$record->unitid = $_POST['unit'];
	   		$record->conceptid = $_POST['node'];
	   		$record->date = date('Y-m-d H:m:s');
	   			
	   		try {
	   			//Salva o log no banco de dados
	   			$this->DB->insert_record('oaeditor_logs', $record, false);
	   		}catch(Exception $ex) {
	   		}
	   	}
   	
   }
    
    private function tree_edit($name_unit, $id_unit, $current_node){
    	
    	$path_unit = $this->retiraAcentos($name_unit);
    	
    	$xml = simplexml_load_file(FILES.$path_unit.DS."graph.xml");

    	$pilha = array('0'); //Inicia a pilha com primeiro elemento com valor 0
    	
    	if($current_node == 0) {
    		$view = '<ul onclick="javascript:saveContent();" id="browser" class="filetree"><li><a href="'.WWW_APP.'units/edit/unit/'.$id_unit.'"><span class="folder hover">'.$name_unit.'</span></a><ul>';
    	}else {
    		$view = '<ul onclick="javascript:saveContent();" id="browser" class="filetree"><li><a href="'.WWW_APP.'units/edit/unit/'.$id_unit.'"><span class="folder">'.$name_unit.'</span></a><ul>';
    	}
    	
    	while(!empty($pilha)) {
    		
    		//Seta filho como 0
    		$son = 0;
    		
    		foreach($xml->edge as $edge){
    			//Verifica se o topo da pilha tem filho
    			if( $edge['source'] == $pilha[count($pilha)-1] && $edge['ref'] == 'false'){
    				$son = (int) $edge['target'];    				
					unset($edge[0]);
    				break;
    			}
    		}
    		
    		//Verifica se encontrou o filho
    		if($son != 0){
    			
    			foreach ($xml->node as $node){
    				if( $node['id'] == $son ){
    					if($node['id'] == $current_node) {
    						$view .= '<li><a onclick="javascript:saveContent();" href="'.WWW_APP.'units/edit/unit/'.$id_unit.'/node/'.$node['id'].'/level/1/'.'"><span class="file hover">'.$node['name'].'</span></a><ul>';
    					}else {
    						$view .= '<li><a onclick="javascript:saveContent();" href="'.WWW_APP.'units/edit/unit/'.$id_unit.'/node/'.$node['id'].'/level/1/'.'"><span class="file">'.$node['name'].'</span></a><ul>';
    					}
    					break;
    				}
    			}    			
    			array_push($pilha, $son);
    			
    		}else{
    			$view .= '</ul></li>';
    			array_pop($pilha);
    		}
    		
    	}
    	
    	return str_replace('<ul></ul>', '', $view);
    }
    
    private function tree_vision($name_unit, $id_unit, $current_node){
    	
    	$path_unit = $this->retiraAcentos($name_unit);
    	$xml = simplexml_load_file(FILES.$path_unit.DS."graph.xml");
    
    	$pilha = array('0'); //Inicia a pilha com primeiro elemento com valor 0
    	 
    	if($current_node == 0) {
    		$view = '<ul id="browser" class="filetree"><li><a href="'.WWW_APP.'units/vision/unit/'.$id_unit.'"><span class="folder hover">'.$name_unit.'</span></a><ul>';
    	}else {
    		$view = '<ul id="browser" class="filetree"><li><a href="'.WWW_APP.'units/vision/unit/'.$id_unit.'"><span class="folder">'.$name_unit.'</span></a><ul>';
    	}
    	 
    	while (!empty($pilha)){
    
    		//Seta filho como 0
    		$son = 0;
    
    		foreach ($xml->edge as $edge){
    			//Verifica se o topo da pilha tem filho
    			if( $edge['source'] == $pilha[count($pilha)-1] && $edge['ref'] == 'false'){
    				$son = (int) $edge['target'];
    				unset($edge[0]);
    				break;
    			}
    		}
    
    		//Verifica se encontrou o filho
    		if($son != 0){
    			 
    			foreach ($xml->node as $node){
    				if( $node['id'] == $son ){
    					if($node['id'] == $current_node)
    					$view .= '<li><a href="'.WWW_APP.'units/vision/unit/'.$id_unit.'/node/'.$node['id'].'"><span class="file hover">'.$node['name'].'</span></a><ul>';
    					else
    					$view .= '<li><a href="'.WWW_APP.'units/vision/unit/'.$id_unit.'/node/'.$node['id'].'"><span class="file">'.$node['name'].'</span></a><ul>';
    					break;
    				}
    			}
    			array_push($pilha, $son);
    			 
    		}else{
    			$view .= '</ul></li>';
    			array_pop($pilha);
    		}
    
    	}
    	 
    	return str_replace('<ul></ul>', '', $view);
    }
    
    function removeTree($rootDir)
    {
    	if (!is_dir($rootDir))
    	{
    		return false;
    	}
    
    	if (!preg_match("/\\/$/", $rootDir))
    	{
    		$rootDir .= '/';
    	}
    
    
    	$stack = array($rootDir);
    
    	while (count($stack) > 0)
    	{
    		$hasDir = false;
    		$dir    = end($stack);
    		$dh     = opendir($dir);
    
    		while (($file = readdir($dh)) !== false)
    		{
    			if ($file == '.'  ||  $file == '..')
    			{
    				continue;
    			}
    
    			if (is_dir($dir . $file))
    			{
    				$hasDir = true;
    				array_push($stack, $dir . $file . '/');
    			}
    
    			else if (is_file($dir . $file))
    			{
    				unlink($dir . $file);
    			}
    		}
    
    		closedir($dh);
    
    		if ($hasDir == false)
    		{
    			array_pop($stack);
    			rmdir($dir);
    		}
    	}
    
    	return true;
    }
    
    private function get_content($unitid, $unit_name, $nodeid){
    	
    	$path_name = $this->retiraAcentos($unit_name);
    	
    	$result = $this->DB->get_records('oaeditor_logs',array('unitid'=>$unitid, 'conceptid'=>$nodeid, 'userid'=>$this->USER->id));
    	
    	$content = file_get_contents($this->getWay($path_name, $nodeid, '1'));
    	
    	if(count($result) >= 2){
    		$content .= '<br><br>Detalhado:<br><br>';
    		$content .= file_get_contents($this->getWay($path_name, $nodeid, '2'));
    	}
    	
    	if(count($result) >= 3){
    		$content .= '<br><br>Saiba mais:<br><br>';
    		$content .= file_get_contents($this->getWay($path_name, $nodeid, '3'));
    	}
    	
    	return $content;
    }
    
    private function isNode($xml, $node_name) {
    	$exist = 0;
    	
    	$node_token = $this->retiraAcentos($node_name);
    	
    	foreach ($xml->node as $node){
    		if($node['token'] == $node_token){
    			$exist = $node['id'];
    			break;
    		}
    	}
    	
    	return $exist;
    }
    
    private function isEdge($xml, $source, $target) {
    	$exist = 0;
    	    	
    	foreach($xml->edge as $edge){
    		if((String)$edge['source'] == (String)$source && (String)$edge['target'] == (String)$target){
    			$exist = 1;
    			break;
    		}
    	}
    
    	return $exist;
    }
    
    
    private function getWay($name_unit, $id_node, $level){
    	
    	$caminho = false;
    	
    	switch ($level){
    		case 1 :
    			$caminho = FILES.$name_unit.DS.$id_node.DS.'sintetico.html';
    			break;
    		case 2 :
    			$caminho = FILES.$name_unit.DS.$id_node.DS.'detalhado.html';
    			break;
    		case 3 :
    			$caminho = FILES.$name_unit.DS.$id_node.DS.'saiba_mais.html';
    			break;
    		default:
    			break;
    	}
    	
    	return $caminho;
    	
    }
    
    private function hasChildren($xml, $node) {
    	$exist = false;
    	
    	foreach ($xml->edge as $edge){
    		if((String) $edge['source'] == (String) $node){
    			$exist = true;
    			break;
    		}
    	}
    
    	return $exist;
    }
    
    private function addRemoveLink($path, $name_node, $id_node, $id_unit, $remove = false) {
    	
    	$name_html = htmlentities($name_node, ENT_QUOTES | ENT_IGNORE, "UTF-8");
    	$diretorios = array();

    	$dir = FILES.$path.DS;
    	//Testa se é um diretório
    	if(is_dir($dir)) {
    		$diretorio = opendir($dir);
    		//Armazena todos os diretorios sem o "." e o ".."
    		while(false !== ($arq = readdir($diretorio))) {
                if ((is_dir($dir . $arq)) && ($arq != ".") && ($arq != "..")) {
                	$diretorios[] = $arq;   
                }
            }
    	}
    	//Percorre todos os diretorios e adiciona ou remove os links de acordo com
    	//o parâmetro $remove 
    	for($i = 0; $i < count($diretorios); $i++) {
    		$sintetico = $dir.$diretorios[$i].DS."sintetico.html";
    		$detalhado = $dir.$diretorios[$i].DS."detalhado.html";
    		$saibaMais = $dir.$diretorios[$i].DS."saiba_mais.html";
    		
    		if(is_file($sintetico)) {
    			$contentSintetico = file_get_contents($sintetico);
    			if($remove) {
    				$contentSintetico = str_replace('<a class="concept" href="'.WWW_APP.'units/vision/unit/'.$id_unit.'/node/'.$id_node.'">'.$name_html.'</a>', $name_html, $contentSintetico);
    			}else {
    				$contentSintetico = str_replace($name_html, '<a class="concept" href="'.WWW_APP.'units/vision/unit/'.$id_unit.'/node/'.$id_node.'">'.$name_node.'</a>', $contentSintetico);
    			}
    			$this->salvaArquivo($sintetico, $contentSintetico);
    		}
    		if(is_file($detalhado)) {
    			$contentDetalhado = file_get_contents($detalhado);
    			if($remove) {
    				$contentDetalhado = str_replace('<a class="concept" href="'.WWW_APP.'units/vision/unit/'.$id_unit.'/node/'.$id_node.'">'.$name_html.'</a>', $name_html,$contentDetalhado);	
    			}else {
    				$contentDetalhado = str_replace($name_html, '<a class="concept" href="'.WWW_APP.'units/vision/unit/'.$id_unit.'/node/'.$id_node.'">'.$name_node.'</a>', $contentDetalhado);
    			}
    			$this->salvaArquivo($detalhado, $contentDetalhado);
    		}
    		if(is_file($saibaMais)) {
    			$contentSaibaMais = file_get_contents($saibaMais);
    			if($remove) {
    				$contentSaibaMais = str_replace('<a class="concept" href="'.WWW_APP.'units/vision/unit/'.$id_unit.'/node/'.$id_node.'">'.$name_html.'</a>', $name_html, $contentSaibaMais);	
    			}else {
    				$contentSaibaMais = str_replace($name_html, '<a class="concept" href="'.WWW_APP.'units/vision/unit/'.$id_unit.'/node/'.$id_node.'">'.$name_node.'</a>', $contentSaibaMais);
    			}
    			$this->salvaArquivo($saibaMais, $contentSaibaMais);
    		}
    	}
    }
    
    private function salvaArquivo($path, $content) {
    	try {    			
    		$fp = fopen($path, "w+");
    		fwrite($fp, $content);
    		fclose($fp);
    	} catch (Exception $e) {
    		$this->setErro('Erro ao salvar arquivo. '.$e);
    		header('Location: '.WWW_APP.'units/');
    	}
    }
    
}